/**
 * 解析器要实现的功能就是将模版编译解析成AST。
 * 例如：
 * <div>
 *  <p>{{name}}</p> 
 * </div>
 * 上面的代码就是一个简单的模版，它转换成AST后的样子如下：
 * {
 * tag:'div',
 * type:1,
 * staticRoot:false,
 * static:false,
 * plain:true,
 * parent:undefined,
 * attrList:[],
 * attrsMap:{},
 * children:[
 * {
 * tag:'p',
 * type:1,
 * staticRoot:false,
 * static:false,
 * plain:true,
 * parent:{tag:'div},
 * attrList:[],
 * attrsMap:{},
 * children:[
 * {
 * type:2,
 * text:'{{name}}',
 * static:false,
 * expression:'_s(name)'
 * }
 * ]
 * }
 * ]
 * }
 * 
 * 
 * 其实AST并不是多么神奇的东西，他只是用js的对象来描述一个节点，一个对象表示一个节点，对象中的属性用来保存节点所需的各种数据。
 * 例如：parent属性保存了父节点的描述对象，children属性是一个数组，里面保存了关于子节点的描述对象。type表示节点的类型。
 * 当很多个独立的节点通过parent属性和children属性连接在一起，就变成了一个树，这样一个用对象描述的节点数其实就是AST。
 */